"use strict";
// 插件示例
let ESample = function (selector, options) {
    // 目标元素
    let the = this;

    // 查找对象
    let $element = $(selector);
    let $body = $('body');

    if (!$element.length) {
        return;
    }

    // 默认设置
    let defaultOptions = {};

    // 私有方法
    let Plugin = {
        construct: function (options) {
            if (EUtil.data($element).has('sample')) {
                // 如果已经初始化，直接从缓存获取对象
                the = EUtil.data($element).get('sample');
            } else {
                // 初始化插件
                Plugin.init(options);
                // 绑定事件
                Plugin.build();
                EUtil.data($element).set('sample', the);
            }
            return the;
        },

        /**
         * 初始化
         *
         * @param options {object} option
         */
        init: function (options) {
            // 事件
            the.events = [];

            // handlers
            the.eventHandlers = {};

            // 合并默认选项&传入option
            the.options = $.extend(true, {}, defaultOptions, options);

        },
        /**
         * 绑定事件
         */
        build: function () {

        },
        /**
         * 触发事件
         *
         * @param name {string} 事件名称
         * @param args {object} 参数
         */
        eventTrigger: function (name, args) {
            for (let i = 0; i < the.events.length; i++) {
                let event = the.events[i];
                if (event.name === name) {
                    if (event.one) {
                        // 一次性事件
                        if (!event.fired) {
                            // 设置事件属性为已触发，下次不执行
                            the.events[i].fired = true;
                            event.handler.call(this, the, args);
                        }
                    } else {
                        event.handler.call(this, the, args);
                    }
                }
            }
        },

        /**
         * 添加事件
         *
         * @param name {string} 事件名称
         * @param handler {function} 回调
         * @param one {boolean} 是否一次性
         */
        addEvent: function (name, handler, one) {
            the.events.push({
                name: name,
                handler: handler,
                one: one,
                fired: false
            });
        },
        /**
         * 移除事件
         *
         * @param name {string} 事件名称
         */
        removeEvent: function (name) {
            if (the.events[name]) {
                delete the.events[name];
            }
        }
    };

    // 公开方法
    /**
     * 设置默认option
     *
     * @param options {object} 选项
     */
    the.setDefaults = function (options) {
        defaultOptions = options;
    };


    /**
     * 绑定事件
     *
     * @param name {string} 事件名称
     * @param handler {function} 回调
     * @returns {*|void}
     */
    the.on = function (name, handler) {
        return Plugin.addEvent(name, handler);
    };
    /**
     * 绑定一次性事件
     *
     * @param name {string} 事件名称
     * @param handler {function} 回调
     * @returns {*|void}
     */
    the.one = function (name, handler) {
        return Plugin.addEvent(name, handler, true);
    };

    Plugin.construct.apply(the, [options]);
    return the;
};